Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

260
Views
Regex para delimitador de espacios en blanco excepto para los caracteres [ y ]

Me considero bastante bueno con las expresiones regulares, pero esta parece ser sorprendentemente complicada.

Quiero recortar todos los espacios en blanco, excepto los que están entre los caracteres "" y [].

Usé esta expresión regular ("[^"]*"|\S+)\s+ pero dividí la parte [06/Jan/2021:17:50:09 +0300] de mi registro en dos bloques.

Aquí está mi línea de registro completa:

 [06/Jan/2021:17:50:09 +0300] "" 10.139.3.194 407 "CONNECT clients5.google.com:443 HTTP/1.1" "" "-" "" 4245 75 "" "" "81" ""

El resultado que obtengo se basa en mi expresión regular usando el comando sed (reemplazando los espacios en blanco por una coma):

 [06/Jan/2021:17:50:09,+0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""

Finalmente el resultado que quiero tener:

 [06/Jan/2021:17:50:09 +0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Dado que la entrada de estas muestras se parece a los registros, teniendo en cuenta que siempre estarán en el mismo formato; con esto podría intentar seguir el código awk , escrito y probado en los ejemplos mostrados en GNU awk .

 awk -v FPAT='[^]]*\\]|"[^"]*"|([0-9]+\\.){3}[0-9]+|[0-9]{2,4}' -v OFS="," '{$1=$1} 1' Input_file

Explicación:

  • La explicación simple sería usar GNU awk aquí. Que tiene la opción FPAT disponible en él.
  • Opción para establecer separadores de campo en forma de expresiones regulares. Coincide con las cosas según la expresión regular mencionada en FPAT y crea campos en consecuencia por línea.
  • Luego, establezca OFS (separador de campo de salida) como , también para todas las líneas.
  • En el programa principal de la línea de restablecimiento de awk (restableciendo el primer campo) para aplicarle el valor OFS según el requisito de OP. Lo que asegurará que las comas aparezcan en la salida solo según sea necesario.

Explicación de expresiones regulares:

 [^]]*\\] ##Matching everything till ] followed by ] here. | ##OR "[^"]*" ##Matching from " till first occurrence of " everything between them including " | ##OR ([0-9]+\\.){3}[0-9]+ ##Matching digits followed by dot 3 times followed by digits | ##OR [0-9]{2,4} ##Matching 2 to 4 digits here.
over 4 years ago · Santiago Trujillo Report

0

Puede unir cadenas entre corchetes agregando \[[^][]*] como alternativa al patrón del Grupo 1:

 sed -E 's/(\[[^][]*]|"[^"]*"|\S+)\s+/\1,/g'

Ahora, el patrón POSIX ERE (sintaxis habilitada con la opción -E ) coincide

  • (\[[^][]*]|"[^"]*"|\S+) - Grupo 1: ya sea
    • \[[^][]*] - un [ carácter, luego cero o más caracteres que no sean [ y ] y luego un ] carácter
    • |
    • "[^"]*" - un " carácter, cero o más caracteres que no sean " y luego un " carácter
    • | - o
    • \S+ - uno o más caracteres que no sean espacios en blanco
  • \s+ - uno o más espacios en blanco

Vea la demostración en línea :

 #!/bin/bash s='[06/Jan/2021:17:50:09 +0300] "" 10.139.3.194 407 "CONNECT clients5.google.com:443 HTTP/1.1" "" "-" "" 4245 75 "" "" "81" ""' sed -E 's/(\[[^][]*]|"[^"]*"|\S+)\s+/\1,/g' <<< "$s"

Producción:

 [06/Jan/2021:17:50:09 +0300],"",10.139.3.194,407,"CONNECT clients5.google.com:443 HTTP/1.1","","-","",4245,75,"","","81",""
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!